Finite Impulse Response (FIR) digital filtering is used in many signal processing applications. A data stream is often filtered in multiple stages, with the output of one filter serving as the input of another filter. In addition, a plurality of such data streams may need to be processed in parallel. A typical filtering operation typically comprises a processing loop where the input data stream and filter coefficients are read, and convolved to produce the output data.
Filtering performance can be improved to meet higher throughput requirements, for example, by increasing the clock frequency of the processing hardware. The clock frequency, however, will be constrained by a physical limit. The filtering performance can also be improved, for example, using a vector approach to exploit data-level parallelism of the filtering operation. A vector approach processes multiple samples (i.e., a vector) in one cycle by adding additional parallel hardware (e.g., multipliers and accumulators). A vector approach is possible if the data and coefficients are stored in contiguous locations.
For each filter, the processing loop has a fixed overhead in the number of cycles before the loop attains steady state, which increases with the depth of the pipeline. Also, with a vector approach, this fixed overhead becomes a higher fraction of the overall processing cycles. Thus, for a plurality of filters, each filter requires a separate processing loop, and the overall processing efficiency decreases. In applications requiring low latency, e.g., a Digital Front End (DFE) of a wireless base station, the input block sizes are small, so the number of iterations in each loop is also fairly small. Thus, the number of loop overhead cycles is comparable to (or sometimes greater than) the actual number of processing cycles.
A need therefore exists for filtering techniques that improve processing efficiency by reducing the number of loops. A further need exists for filtering techniques that improve processing efficiency by reducing the number of loops to a single loop.